package com.xutianpeng.disk.user.service;

import com.xutianpeng.disk.mybatis.entity.PtUserEntity;
import com.xutianpeng.disk.mybatis.flexigrid.PagingEntity;
import com.xutianpeng.disk.mybatis.flexigrid.TblResponseEntity;
import com.xutianpeng.disk.mybatis.ztree.ZtreeEntity;
import com.xutianpeng.disk.user.entity.SearchUserEntity;
import com.xutianpeng.disk.user.exeption.EmailRepeatException;
import com.xutianpeng.disk.user.exeption.MobileRepeatException;
import com.xutianpeng.disk.user.exeption.UserNameRepeatException;
import com.xutianpeng.disk.user.exeption.UserOccupyException;

import java.util.List;

public interface UserService {
    /**
     * 查询用户列表
     * @return 用户列表
     */
    List<PtUserEntity> queryUserList();

    /**
     * 批量删除用户（逻辑删除）
     * @param ids 用户编码数组字符串，以逗号分隔
     * @throws UserOccupyException 当用户关联角色时抛出
     */
    void deleteUserByIds(String ids) throws UserOccupyException;

    /**
     * 分页查询用户信息
     * @param entity 搜索条件实体
     * @param paging 分页参数实体
     * @return 分页响应实体，包含用户列表及分页信息
     */
    TblResponseEntity<PtUserEntity> queryUserInfoListByPage(SearchUserEntity entity, PagingEntity paging);

    /**
     * 根据用户UUID查询用户信息
     * @param userUuid 用户唯一标识
     * @return 用户实体信息，不存在则返回null
     */
    PtUserEntity queryUserInfoById(String userUuid);

    /**
     * 修改用户信息
     * @param entity 包含更新信息的用户实体
     * @throws EmailRepeatException 邮箱已被占用时抛出
     * @throws MobileRepeatException 手机号已被占用时抛出
     * @throws UserNameRepeatException 用户名已被占用时抛出
     */
    void modifyUserInfoById(PtUserEntity entity) throws EmailRepeatException, MobileRepeatException, UserNameRepeatException;

    /**
     * 新增用户信息
     * @param entity 包含用户信息的实体
     * @throws EmailRepeatException 邮箱已被占用时抛出
     * @throws MobileRepeatException 手机号已被占用时抛出
     * @throws UserNameRepeatException 用户名已被占用时抛出
     */
    void addUserInfo(PtUserEntity entity) throws EmailRepeatException, MobileRepeatException, UserNameRepeatException;

    /**
     * 根据用户查询关联的角色列表（用于角色分配）
     * @param userUuid 用户唯一标识
     * @return 角色ZTree实体列表，包含角色ID和名称，已关联角色会标记选中状态
     */
    List<ZtreeEntity> queryRoleTreeListByUser(String userUuid);

    /**
     * 保存用户与角色的关联关系
     * @param userUuidArray 用户UUID数组字符串，以逗号分隔
     * @param roleUuidArray 角色UUID数组字符串，以逗号分隔
     */
    void saveRoleRefUser(String userUuidArray, String roleUuidArray);

    /**
     * 根据用户名查询用户信息（用于登录验证）
     * @param username 用户名
     * @return 用户实体，包含密码等认证信息
     */
    PtUserEntity queryUserByUsername(String username);

    /**
     * 检查手机号是否已被注册
     * @param mobile 手机号
     * @return 已注册返回true，否则返回false
     */
    boolean checkMobileExists(String mobile);

    /**
     * 检查邮箱是否已被注册
     * @param email 邮箱地址
     * @return 已注册返回true，否则返回false
     */
    boolean checkEmailExists(String email);

    /**
     * 检查用户名是否已被注册
     * @param username 用户名
     * @return 已注册返回true，否则返回false
     */
    boolean checkUsernameExists(String username);

    /**
     * 用户名查询用户
     * @param currentUsername
     * @return
     */
    PtUserEntity getUserByUsername(String currentUsername);

    /**
     * 重置用户密码（单个或批量）
     * @param userUuids 用户UUID数组
     */
    void resetPassword(String[] userUuids);

    /**
     * 用户设置新密码
     * @param userUuid 用户UUID
     * @param newPassword 新密码（明文）
     */
    void setNewPassword(String userUuid, String newPassword);

    /**
     * 检查用户是否需要重置密码
     * @param userUuid 用户UUID
     * @return 是否需要重置
     */
    boolean needResetPassword(String userUuid);
}